Tumor evolution project

Data used

In this notebook, we are using the tmb_genomic.tsv file generated from the 01-preprocess-data.Rmd script.

Set up

suppressPackageStartupMessages({
  library(tidyverse)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder. This will be in the project root directory.
# Use this as the root directory to ensure proper sourcing of functions
# no matter where this is called from.
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
scratch_dir <- file.path(root_dir, "scratch")
analysis_dir <- file.path(root_dir, "analyses", "tmb-vaf-longitudinal") 
input_dir <- file.path(analysis_dir, "input")

# Input files
tmb_genomic_file <- file.path(scratch_dir, "tmb_genomic.tsv")
palette_file <- file.path(root_dir, "figures", "palettes", "tumor_descriptor_color_palette.tsv")

# File path to plots directory
plots_dir <-
  file.path(analysis_dir, "plots")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

source(paste0(analysis_dir, "/util/function-create-barplot.R"))
source(paste0(analysis_dir, "/util/function-create-dumbbell-plot.R"))
source(paste0(root_dir, "/figures/scripts/theme.R"))

Read in data and process

# Read and process tmb_genomic file
df_total <- readr::read_tsv(tmb_genomic_file, guess_max = 100000, show_col_types = FALSE) 

# Are there any samples with both WGS and WXS? 
df_total %>% 
  unique() %>% 
  arrange(Kids_First_Participant_ID, experimental_strategy)  %>%
  group_by(Kids_First_Participant_ID) %>%
  dplyr::summarise(experimental_strategy_sum = str_c(experimental_strategy, collapse = ";")) 

# There are, so let's remove these from downstream analyses.
df <- df_total %>% 
  filter(!experimental_strategy == "WXS") %>% 
  dplyr:::mutate(patient_id = paste(short_histology, Kids_First_Participant_ID, sep = "_"))
    
# Read color palette
palette_df <- readr::read_tsv(palette_file, guess_max = 100000, show_col_types = FALSE)

TMB per Patient case

We will explore TMB per Kids_First_Participant_ID over time by creating stacked barplots.

# Define parameters for function
ylim = max(df$tmb)

# df
f <- c("Second Malignancy", "Unavailable", "Deceased", "Recurrence", "Progressive", "Diagnosis") # Level df by timepoints
df_plot <- df %>% 
  dplyr:::mutate(tumor_descriptor = factor(tumor_descriptor),
                 tumor_descriptor = fct_relevel(tumor_descriptor, f)) 

# Run function
fname <- paste0(plots_dir, "/", "TMB-genomic-total.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-total.pdf"
p <- create_stacked_barplot(tmb_df = df_plot, ylim = ylim)
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
Please use `linewidth` instead.
pdf(file = fname, width = 15, height = 6)
print(p)
dev.off()
quartz_off_screen 
                2 

Attention: Hypermutant TMB defined as ≥10 Mb, and Ultrahypermutant TMB defined as ≥100 mutations/Mb (https://pubmed.ncbi.nlm.nih.gov/29056344/).

Here, we notice that there are samples with high TMB (hyper-mutant samples). Next, we will exclude these samples (threshold >= 10) from downstream analysis. Attention is needed in cases with high number of mutations in only one timepoint as this will lead to un-matched longitudinal samples. We will also remove those so we always have matched longitudinal samples.

# Filter df
df_plot_filter <- df %>%
  filter(!tmb >= 10)  %>%
  unique() %>% 
  arrange(Kids_First_Participant_ID, tumor_descriptor) %>%
  group_by(Kids_First_Participant_ID) %>%
  dplyr::summarise(tumor_descriptor_sum = str_c(tumor_descriptor, collapse = ";")) %>% 
  filter(!tumor_descriptor_sum %in% c("Diagnosis", "Progressive", "Recurrence")) %>% 
  dplyr::left_join(df, by = c("Kids_First_Participant_ID", "tumor_descriptor_sum")) %>% 
  mutate(cancer_group_sum = ifelse(short_histology == "HGAT", "High-grade glioma",
                                   ifelse(short_histology == "LGAT", "Low-grade glioma", "Other cancer group")),
         cancer_group_sum = replace_na(cancer_group_sum, "Other"),
         tumor_descriptor = factor(tumor_descriptor),
         tumor_descriptor = fct_relevel(tumor_descriptor, f)) %>% 
  drop_na(tmb) 


# Define parameters for function
ylim = max(df_plot_filter$tmb)
df_plot_filter <- df_plot_filter

# Run function
fname <- paste0(plots_dir, "/", "TMB-genomic-no-hypermutants.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-no-hypermutants.pdf"
p <- create_stacked_barplot(tmb_df = df_plot_filter, ylim = ylim)
pdf(file = fname, width = 25, height = 8)
print(p)
dev.off()
quartz_off_screen 
                2 

TMB across timepoints and cancer types per Patient case

We will explore TMB per cancer group over time by creating dumbbell plots. We classified by using cancer types with the highest number of samples (High- and Low-grade gliomas) versus any other cancer groups.

cancer_groups <- unique(as.character(df_plot_filter$cancer_group_sum))
cancer_groups <- sort(cancer_groups, decreasing = FALSE)
print(cancer_groups)
[1] "High-grade glioma"  "Low-grade glioma"   "Other cancer group"
for (i in seq_along(cancer_groups)) {
  print(i)
  df_ct_sub <- df_plot_filter %>% 
    filter(cancer_group_sum == cancer_groups [i])
  
  if (i == 1) {
    print(cancer_groups [i])
    # Define parameters for function
    ylim <- 8
    } else if (i == 2) {
      print(cancer_groups [i])
      # Define parameters for function
      ylim <- 4
      } else {
        print(cancer_groups [i])
        # Define parameters for function
        ylim <- 4
      }
    
    # Name plots
    fname <- paste0(plots_dir, "/", "TMB-genomic-dumbbell", "-", cancer_groups[i], ".pdf")
    print(fname)
    
    # Run function
    p <- create_dumbbell_ct(tmb_df = df_ct_sub, 
                                 ylim = ylim, 
                                 ct_id = cancer_groups[i])
    pdf(file = fname, width = 18, height = 10)
    print(p)
    dev.off()
}
[1] 1
[1] "High-grade glioma"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-dumbbell-High-grade glioma.pdf"
[1] 2
[1] "Low-grade glioma"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-dumbbell-Low-grade glioma.pdf"
[1] 3
[1] "Other cancer group"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-genomic-dumbbell-Other cancer group.pdf"

Total number of mutations across timepoints and cancer types per Patient case

for (i in seq_along(cancer_groups)) {
  print(i)
  df_ct_sub <- df_plot_filter %>% 
    filter(cancer_group_sum == cancer_groups [i])
  
  if (i == 1) {
    print(cancer_groups [i])
    # Define parameters for function
    ylim <- 260
    } else if (i == 2) {
      print(cancer_groups [i])
      # Define parameters for function
      ylim <- 150
      } else {
        print(cancer_groups [i])
        # Define parameters for function
        ylim <- 150
      }
    
    # Name plots
    fname <- paste0(plots_dir, "/", "Mutations-genomic-dumbbell", "-", cancer_groups[i], ".pdf")
    print(fname)
    
    # Run function
    p <- create_dumbbell_ct_mut(tmb_df = df_ct_sub, 
                                 ylim = ylim, 
                                 ct_id = cancer_groups[i])
    pdf(file = fname, width = 18, height = 10)
    print(p)
    dev.off()
}
[1] 1
[1] "High-grade glioma"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Mutations-genomic-dumbbell-High-grade glioma.pdf"
[1] 2
[1] "Low-grade glioma"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Mutations-genomic-dumbbell-Low-grade glioma.pdf"
[1] 3
[1] "Other cancer group"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Mutations-genomic-dumbbell-Other cancer group.pdf"

Total number of mutations across timepoints and biospecimen sample per Patient case

Here, we want to explore the number of mutations per timepoint and biospecimen sample per patient case.

samples <- unique(as.character(df_plot_filter$Kids_First_Participant_ID))
print(samples)
 [1] "PT_00G007DM" "PT_02J5CWN5" "PT_1H2REHT2" "PT_1ZAWNGWT" "PT_25Z2NX27"
 [6] "PT_2ECVKTTQ" "PT_2FVTD0WR" "PT_2YT37G8P" "PT_37B5JRP1" "PT_3R0P995B"
[11] "PT_3T3VGWC6" "PT_3VCS1PPF" "PT_7M2PGCBV" "PT_82MX6J77" "PT_89XRZBSG"
[16] "PT_8GN3TQRM" "PT_962TCBVR" "PT_98QMQZY7" "PT_99S5BPE3" "PT_9PJR0ZK7"
[21] "PT_9S6WMQ92" "PT_AQWDQW27" "PT_CXT81GRM" "PT_DFQAH7RS" "PT_ESHACWF6"
[26] "PT_FN4GEEFR" "PT_HFQNKP5X" "PT_HJMP6PH2" "PT_JNEV57VK" "PT_JP1FDKN9"
[31] "PT_JSFBMK5V" "PT_K8ZV7APT" "PT_KMHGNCNR" "PT_MDWPRDBT" "PT_MNSEJCDM"
[36] "PT_N8W26H19" "PT_NPETR8RY" "PT_PFA762TK" "PT_PR4YBBH3" "PT_QH9H491G"
[41] "PT_RJ1TJ2KH" "PT_S2SQJVGK" "PT_S4YNE17X" "PT_T2M1338J" "PT_TKWTTRQ7"
[46] "PT_W6AWJJK7" "PT_WP871F5S" "PT_XA98HG1C" "PT_XHYBZKCX" "PT_XTVQB9S4"
[51] "PT_YGN06RPZ" "PT_Z4GS3ZQQ" "PT_ZMKMKCFQ" "PT_ZZRBX5JT"
for (i in seq_along(samples)) {
  print(i)
  tmb_sub <- df_plot_filter %>%
    filter(Kids_First_Participant_ID == samples[i])
  
  # Define parameters for function
  ylim = max(df_plot_filter$tmb)
 
  # Run function
  fname <- paste0(plots_dir, "/", samples[i], "-TMB-barplot.pdf")
  print(fname)
  p <- create_barplot_sample(tmb_df = tmb_sub,
                             ylim = ylim,
                             sid = samples[i])
  pdf(file = fname, width = 5, height = 4)
  print(p)
  dev.off()
}
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_00G007DM-TMB-barplot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_02J5CWN5-TMB-barplot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1H2REHT2-TMB-barplot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1ZAWNGWT-TMB-barplot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_25Z2NX27-TMB-barplot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2ECVKTTQ-TMB-barplot.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2FVTD0WR-TMB-barplot.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2YT37G8P-TMB-barplot.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_37B5JRP1-TMB-barplot.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3R0P995B-TMB-barplot.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3T3VGWC6-TMB-barplot.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3VCS1PPF-TMB-barplot.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_7M2PGCBV-TMB-barplot.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_82MX6J77-TMB-barplot.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_89XRZBSG-TMB-barplot.pdf"
[1] 16
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_8GN3TQRM-TMB-barplot.pdf"
[1] 17
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_962TCBVR-TMB-barplot.pdf"
[1] 18
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_98QMQZY7-TMB-barplot.pdf"
[1] 19
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_99S5BPE3-TMB-barplot.pdf"
[1] 20
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9PJR0ZK7-TMB-barplot.pdf"
[1] 21
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9S6WMQ92-TMB-barplot.pdf"
[1] 22
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_AQWDQW27-TMB-barplot.pdf"
[1] 23
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_CXT81GRM-TMB-barplot.pdf"
[1] 24
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_DFQAH7RS-TMB-barplot.pdf"
[1] 25
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ESHACWF6-TMB-barplot.pdf"
[1] 26
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_FN4GEEFR-TMB-barplot.pdf"
[1] 27
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HFQNKP5X-TMB-barplot.pdf"
[1] 28
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HJMP6PH2-TMB-barplot.pdf"
[1] 29
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JNEV57VK-TMB-barplot.pdf"
[1] 30
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JP1FDKN9-TMB-barplot.pdf"
[1] 31
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JSFBMK5V-TMB-barplot.pdf"
[1] 32
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_K8ZV7APT-TMB-barplot.pdf"
[1] 33
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KMHGNCNR-TMB-barplot.pdf"
[1] 34
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MDWPRDBT-TMB-barplot.pdf"
[1] 35
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-TMB-barplot.pdf"
[1] 36
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_N8W26H19-TMB-barplot.pdf"
[1] 37
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_NPETR8RY-TMB-barplot.pdf"
[1] 38
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PFA762TK-TMB-barplot.pdf"
[1] 39
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PR4YBBH3-TMB-barplot.pdf"
[1] 40
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_QH9H491G-TMB-barplot.pdf"
[1] 41
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_RJ1TJ2KH-TMB-barplot.pdf"
[1] 42
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S2SQJVGK-TMB-barplot.pdf"
[1] 43
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S4YNE17X-TMB-barplot.pdf"
[1] 44
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_T2M1338J-TMB-barplot.pdf"
[1] 45
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_TKWTTRQ7-TMB-barplot.pdf"
[1] 46
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_W6AWJJK7-TMB-barplot.pdf"
[1] 47
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_WP871F5S-TMB-barplot.pdf"
[1] 48
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XA98HG1C-TMB-barplot.pdf"
[1] 49
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XHYBZKCX-TMB-barplot.pdf"
[1] 50
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XTVQB9S4-TMB-barplot.pdf"
[1] 51
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_YGN06RPZ-TMB-barplot.pdf"
[1] 52
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_Z4GS3ZQQ-TMB-barplot.pdf"
[1] 53
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZMKMKCFQ-TMB-barplot.pdf"
[1] 54
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZZRBX5JT-TMB-barplot.pdf"

Let’s try to do the same by using facet_wrap function. Again, we are missing values in timepoints. Maybe we can divide my names(samples), adjust ylim per each and create 3-4 panels for each ylim.

# Define parameters for function
ylim = max(df_plot_filter$mutation_count)
 
# Run function
fname <- paste0(plots_dir, "/", "TMB-barplot.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/TMB-barplot.pdf"
p <- create_barplot_sample_panel(tmb_df = df_plot_filter,
                             ylim = ylim)
pdf(file = fname, width = 25, height = 20)
print(p)
dev.off()
quartz_off_screen 
                2 

DRAFT ADJUSTING ylim

samples <- unique(as.character(df_plot_filter$Kids_First_Participant_ID))
print(samples)
 [1] "PT_00G007DM" "PT_02J5CWN5" "PT_1H2REHT2" "PT_1ZAWNGWT" "PT_25Z2NX27"
 [6] "PT_2ECVKTTQ" "PT_2FVTD0WR" "PT_2YT37G8P" "PT_37B5JRP1" "PT_3R0P995B"
[11] "PT_3T3VGWC6" "PT_3VCS1PPF" "PT_7M2PGCBV" "PT_82MX6J77" "PT_89XRZBSG"
[16] "PT_8GN3TQRM" "PT_962TCBVR" "PT_98QMQZY7" "PT_99S5BPE3" "PT_9PJR0ZK7"
[21] "PT_9S6WMQ92" "PT_AQWDQW27" "PT_CXT81GRM" "PT_DFQAH7RS" "PT_ESHACWF6"
[26] "PT_FN4GEEFR" "PT_HFQNKP5X" "PT_HJMP6PH2" "PT_JNEV57VK" "PT_JP1FDKN9"
[31] "PT_JSFBMK5V" "PT_K8ZV7APT" "PT_KMHGNCNR" "PT_MDWPRDBT" "PT_MNSEJCDM"
[36] "PT_N8W26H19" "PT_NPETR8RY" "PT_PFA762TK" "PT_PR4YBBH3" "PT_QH9H491G"
[41] "PT_RJ1TJ2KH" "PT_S2SQJVGK" "PT_S4YNE17X" "PT_T2M1338J" "PT_TKWTTRQ7"
[46] "PT_W6AWJJK7" "PT_WP871F5S" "PT_XA98HG1C" "PT_XHYBZKCX" "PT_XTVQB9S4"
[51] "PT_YGN06RPZ" "PT_Z4GS3ZQQ" "PT_ZMKMKCFQ" "PT_ZZRBX5JT"
for (each in names(samples)){
  
  # add titles to print
  if (each == "PT_JNEV57VK"){
    ylim <- 260 # Define parameters for function
  }
  if (each %in% c("PT_2YT37G8P", "PT_9S6WMQ92", "PT_ESHACWF6", "PT_N8W26H19")){
    ylim <- 150 # Define parameters for function
  }  
  if (each %in% c("PT_1H2REHT2", "PT_37B5JRP1", "PT_89XRZBSG", "PT_8GN3TQRM", "PT_99S5BPE3", "PT_9PJR0ZK7", "PT_9S6WMQ92", "PT_CXT81GRM", "PT_HFQNKP5X", "PT_JSFBMK5V", "PT_MDWPRDBT", "PT_TKWTTRQ7", "PT_XA98HG1C")){
    ylim <- 100 # Define parameters for function
  }
   if (each %in% c("PT_00G007DM", "PT_02J5CWN5", "PT_1H2REHT2", "PT_1ZAWNGWT", "PT_25Z2NX27", "PT_2ECVKTTQ", "PT_2FVTD0WR", "PT_2YT37G8P", "PT_37B5JRP1", "PT_3R0P995B", "PT_3T3VGWC6", "PT_3VCS1PPF", "PT_7M2PGCBV", "PT_82MX6J77", "PT_89XRZBSG", "PT_8GN3TQRM", "PT_962TCBVR", "PT_98QMQZY7", "PT_99S5BPE3", "PT_9PJR0ZK7", "PT_AQWDQW27", "PT_CXT81GRM", "PT_DFQAH7RS", "PT_ESHACWF6", "PT_FN4GEEFR", "PT_HFQNKP5X", "PT_HJMP6PH2", "PT_JP1FDKN9", "PT_JSFBMK5V", "PT_K8ZV7APT", "PT_KMHGNCNR", "PT_MDWPRDBT", "PT_MNSEJCDM", "PT_N8W26H19", "PT_NPETR8RY", "PT_PFA762TK", "PT_PR4YBBH3", "PT_QH9H491G", "PT_RJ1TJ2KH", "PT_S2SQJVGK", "PT_S4YNE17X", "PT_T2M1338J", "PT_TKWTTRQ7", "PT_W6AWJJK7", "PT_WP871F5S", "PT_XA98HG1C", "PT_XHYBZKCX", "PT_XTVQB9S4", "PT_YGN06RPZ", "PT_Z4GS3ZQQ", "PT_ZMKMKCFQ", "PT_ZZRBX5JT")){
    ylim <- 50 # Define parameters for function
  }
}
  
 
# Run function
fname <- paste0(plots_dir, "/", samples[i], "TMB-barplot.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZZRBX5JTTMB-barplot.pdf"
p <- create_barplot_sample_panel(tmb_df = df_plot_filter,
                             ylim = ylim)
pdf(file = fname, width = 25, height = 20)
print(p)
dev.off()
quartz_off_screen 
                2 

sessionInfo()
R version 4.2.3 (2023-03-15)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.4.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggthemes_4.2.4  lubridate_1.9.2 forcats_1.0.0   stringr_1.5.0   dplyr_1.1.2    
 [6] purrr_1.0.1     readr_2.1.4     tidyr_1.3.0     tibble_3.2.1    ggplot2_3.4.2  
[11] tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] tidyselect_1.2.0       xfun_0.39              colorspace_2.1-0      
 [4] vctrs_0.6.3            generics_0.1.3         htmltools_0.5.5       
 [7] stats4_4.2.3           yaml_2.3.7             utf8_1.2.3            
[10] rlang_1.1.1            pillar_1.9.0           glue_1.6.2            
[13] withr_2.5.0            BiocGenerics_0.44.0    bit64_4.0.5           
[16] GenomeInfoDbData_1.2.9 lifecycle_1.0.3        zlibbioc_1.44.0       
[19] munsell_0.5.0          gtable_0.3.3           evaluate_0.21         
[22] labeling_0.4.2         knitr_1.43             tzdb_0.4.0            
[25] IRanges_2.32.0         fastmap_1.1.1          GenomeInfoDb_1.34.9   
[28] parallel_4.2.3         fansi_1.0.4            scales_1.2.1          
[31] S4Vectors_0.36.2       vroom_1.6.3            XVector_0.38.0        
[34] farver_2.1.1           bit_4.0.5              hms_1.1.3             
[37] digest_0.6.33          stringi_1.7.12         GenomicRanges_1.50.2  
[40] rprojroot_2.0.3        cli_3.6.1              tools_4.2.3           
[43] bitops_1.0-7           magrittr_2.0.3         RCurl_1.98-1.12       
[46] crayon_1.5.2           pkgconfig_2.0.3        data.table_1.14.8     
[49] timechange_0.2.0       rmarkdown_2.23         rstudioapi_0.15.0     
[52] R6_2.5.1               compiler_4.2.3        
LS0tCnRpdGxlOiAiRXhwbG9yZSBUTUIgYW5kIG51bWJlciBvZiBtdXRhdGlvbnMgYWNyb3NzIG11bHRpcGxlIHRpbWVwb2ludHMgb2YgdGhlIFBCVEEgQ29ob3J0IgphdXRob3I6ICJBbnRvbmlhIENocm9uaSA8Y2hyb25pYUBjaG9wLmVkdT4gZm9yIEQzQiIKZGF0ZTogIjIwMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgojIyMjIFR1bW9yIGV2b2x1dGlvbiBwcm9qZWN0IAoKIyMjIERhdGEgdXNlZCAKSW4gdGhpcyBub3RlYm9vaywgd2UgYXJlIHVzaW5nIHRoZSBgdG1iX2dlbm9taWMudHN2YCBmaWxlIGdlbmVyYXRlZCBmcm9tIHRoZSBgMDEtcHJlcHJvY2Vzcy1kYXRhLlJtZGAgc2NyaXB0LgoKIyBTZXQgdXAKYGBge3IgbG9hZC1saWJyYXJ5fQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQp9KQpgYGAKCiMgRGlyZWN0b3JpZXMgYW5kIEZpbGUgSW5wdXRzL091dHB1dHMKYGBge3Igc2V0LWRpci1hbmQtZmlsZS1uYW1lc30KIyBEZXRlY3QgdGhlICIuZ2l0IiBmb2xkZXIuIFRoaXMgd2lsbCBiZSBpbiB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KIyBVc2UgdGhpcyBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gZW5zdXJlIHByb3BlciBzb3VyY2luZyBvZiBmdW5jdGlvbnMKIyBubyBtYXR0ZXIgd2hlcmUgdGhpcyBpcyBjYWxsZWQgZnJvbS4Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCnNjcmF0Y2hfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgInNjcmF0Y2giKQphbmFseXNpc19kaXIgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAidG1iLXZhZi1sb25naXR1ZGluYWwiKSAKaW5wdXRfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJpbnB1dCIpCgojIElucHV0IGZpbGVzCnRtYl9nZW5vbWljX2ZpbGUgPC0gZmlsZS5wYXRoKHNjcmF0Y2hfZGlyLCAidG1iX2dlbm9taWMudHN2IikKcGFsZXR0ZV9maWxlIDwtIGZpbGUucGF0aChyb290X2RpciwgImZpZ3VyZXMiLCAicGFsZXR0ZXMiLCAidHVtb3JfZGVzY3JpcHRvcl9jb2xvcl9wYWxldHRlLnRzdiIpCgojIEZpbGUgcGF0aCB0byBwbG90cyBkaXJlY3RvcnkKcGxvdHNfZGlyIDwtCiAgZmlsZS5wYXRoKGFuYWx5c2lzX2RpciwgInBsb3RzIikKaWYgKCFkaXIuZXhpc3RzKHBsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKHBsb3RzX2RpcikKfQoKc291cmNlKHBhc3RlMChhbmFseXNpc19kaXIsICIvdXRpbC9mdW5jdGlvbi1jcmVhdGUtYmFycGxvdC5SIikpCnNvdXJjZShwYXN0ZTAoYW5hbHlzaXNfZGlyLCAiL3V0aWwvZnVuY3Rpb24tY3JlYXRlLWR1bWJiZWxsLXBsb3QuUiIpKQpzb3VyY2UocGFzdGUwKHJvb3RfZGlyLCAiL2ZpZ3VyZXMvc2NyaXB0cy90aGVtZS5SIikpCmBgYAoKIyBSZWFkIGluIGRhdGEgYW5kIHByb2Nlc3MKYGBge3IgcmVhZF9pbnB1dF9maWxlc30KIyBSZWFkIGFuZCBwcm9jZXNzIHRtYl9nZW5vbWljIGZpbGUKZGZfdG90YWwgPC0gcmVhZHI6OnJlYWRfdHN2KHRtYl9nZW5vbWljX2ZpbGUsIGd1ZXNzX21heCA9IDEwMDAwMCwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkgCgojIEFyZSB0aGVyZSBhbnkgc2FtcGxlcyB3aXRoIGJvdGggV0dTIGFuZCBXWFM/IApkZl90b3RhbCAlPiUgCiAgdW5pcXVlKCkgJT4lIAogIGFycmFuZ2UoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgZXhwZXJpbWVudGFsX3N0cmF0ZWd5KSAgJT4lCiAgZ3JvdXBfYnkoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShleHBlcmltZW50YWxfc3RyYXRlZ3lfc3VtID0gc3RyX2MoZXhwZXJpbWVudGFsX3N0cmF0ZWd5LCBjb2xsYXBzZSA9ICI7IikpIAoKIyBUaGVyZSBhcmUsIHNvIGxldCdzIHJlbW92ZSB0aGVzZSBmcm9tIGRvd25zdHJlYW0gYW5hbHlzZXMuCmRmIDwtIGRmX3RvdGFsICU+JSAKICBmaWx0ZXIoIWV4cGVyaW1lbnRhbF9zdHJhdGVneSA9PSAiV1hTIikgJT4lIAogIGRwbHlyOjo6bXV0YXRlKHBhdGllbnRfaWQgPSBwYXN0ZShzaG9ydF9oaXN0b2xvZ3ksIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHNlcCA9ICJfIikpCiAgICAKIyBSZWFkIGNvbG9yIHBhbGV0dGUKcGFsZXR0ZV9kZiA8LSByZWFkcjo6cmVhZF90c3YocGFsZXR0ZV9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmBgYAoKIyBUTUIgcGVyIFBhdGllbnQgY2FzZQpXZSB3aWxsIGV4cGxvcmUgVE1CIHBlciBgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRGAgb3ZlciB0aW1lIGJ5IGNyZWF0aW5nIHN0YWNrZWQgYmFycGxvdHMuCgpgYGB7ciBjcmVhdGUtc3RhY2tlZC1iYXJwbG90LCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp5bGltID0gbWF4KGRmJHRtYikKCiMgZGYKZiA8LSBjKCJTZWNvbmQgTWFsaWduYW5jeSIsICJVbmF2YWlsYWJsZSIsICJEZWNlYXNlZCIsICJSZWN1cnJlbmNlIiwgIlByb2dyZXNzaXZlIiwgIkRpYWdub3NpcyIpICMgTGV2ZWwgZGYgYnkgdGltZXBvaW50cwpkZl9wbG90IDwtIGRmICU+JSAKICBkcGx5cjo6Om11dGF0ZSh0dW1vcl9kZXNjcmlwdG9yID0gZmFjdG9yKHR1bW9yX2Rlc2NyaXB0b3IpLAogICAgICAgICAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmY3RfcmVsZXZlbCh0dW1vcl9kZXNjcmlwdG9yLCBmKSkgCgojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJUTUItZ2Vub21pYy10b3RhbC5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90KHRtYl9kZiA9IGRmX3Bsb3QsIHlsaW0gPSB5bGltKQpwZGYoZmlsZSA9IGZuYW1lLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSA2KQpwcmludChwKQpkZXYub2ZmKCkKYGBgCkF0dGVudGlvbjogSHlwZXJtdXRhbnQgVE1CIGRlZmluZWQgYXMg4omlMTAgTWIsIGFuZCBVbHRyYWh5cGVybXV0YW50IFRNQiBkZWZpbmVkIGFzIOKJpTEwMCBtdXRhdGlvbnMvTWIgKGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMjkwNTYzNDQvKS4KCkhlcmUsIHdlIG5vdGljZSB0aGF0IHRoZXJlIGFyZSBzYW1wbGVzIHdpdGggaGlnaCBUTUIgKGh5cGVyLW11dGFudCBzYW1wbGVzKS4gTmV4dCwgd2Ugd2lsbCBleGNsdWRlIHRoZXNlIHNhbXBsZXMgKHRocmVzaG9sZCA+PSAxMCkgZnJvbSBkb3duc3RyZWFtIGFuYWx5c2lzLiBBdHRlbnRpb24gaXMgbmVlZGVkIGluIGNhc2VzIHdpdGggaGlnaCBudW1iZXIgb2YgbXV0YXRpb25zIGluIG9ubHkgb25lIHRpbWVwb2ludCBhcyB0aGlzIHdpbGwgbGVhZCB0byB1bi1tYXRjaGVkIGxvbmdpdHVkaW5hbCBzYW1wbGVzLiBXZSB3aWxsIGFsc28gcmVtb3ZlIHRob3NlIHNvIHdlIGFsd2F5cyBoYXZlIG1hdGNoZWQgbG9uZ2l0dWRpbmFsIHNhbXBsZXMuCgpgYGB7ciBjcmVhdGUtc3RhY2tlZC1iYXJwbG90LWZpbHRlciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA4LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KIyBGaWx0ZXIgZGYKZGZfcGxvdF9maWx0ZXIgPC0gZGYgJT4lCiAgZmlsdGVyKCF0bWIgPj0gMTApICAlPiUKICB1bmlxdWUoKSAlPiUgCiAgYXJyYW5nZShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCB0dW1vcl9kZXNjcmlwdG9yKSAlPiUKICBncm91cF9ieShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKHR1bW9yX2Rlc2NyaXB0b3Jfc3VtID0gc3RyX2ModHVtb3JfZGVzY3JpcHRvciwgY29sbGFwc2UgPSAiOyIpKSAlPiUgCiAgZmlsdGVyKCF0dW1vcl9kZXNjcmlwdG9yX3N1bSAlaW4lIGMoIkRpYWdub3NpcyIsICJQcm9ncmVzc2l2ZSIsICJSZWN1cnJlbmNlIikpICU+JSAKICBkcGx5cjo6bGVmdF9qb2luKGRmLCBieSA9IGMoIktpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQiLCAidHVtb3JfZGVzY3JpcHRvcl9zdW0iKSkgJT4lIAogIG11dGF0ZShjYW5jZXJfZ3JvdXBfc3VtID0gaWZlbHNlKHNob3J0X2hpc3RvbG9neSA9PSAiSEdBVCIsICJIaWdoLWdyYWRlIGdsaW9tYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNob3J0X2hpc3RvbG9neSA9PSAiTEdBVCIsICJMb3ctZ3JhZGUgZ2xpb21hIiwgIk90aGVyIGNhbmNlciBncm91cCIpKSwKICAgICAgICAgY2FuY2VyX2dyb3VwX3N1bSA9IHJlcGxhY2VfbmEoY2FuY2VyX2dyb3VwX3N1bSwgIk90aGVyIiksCiAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmYWN0b3IodHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmY3RfcmVsZXZlbCh0dW1vcl9kZXNjcmlwdG9yLCBmKSkgJT4lIAogIGRyb3BfbmEodG1iKSAKCgojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp5bGltID0gbWF4KGRmX3Bsb3RfZmlsdGVyJHRtYikKZGZfcGxvdF9maWx0ZXIgPC0gZGZfcGxvdF9maWx0ZXIKCiMgUnVuIGZ1bmN0aW9uCmZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgIlRNQi1nZW5vbWljLW5vLWh5cGVybXV0YW50cy5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90KHRtYl9kZiA9IGRmX3Bsb3RfZmlsdGVyLCB5bGltID0geWxpbSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gOCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyBUTUIgYWNyb3NzIHRpbWVwb2ludHMgYW5kIGNhbmNlciB0eXBlcyBwZXIgUGF0aWVudCBjYXNlCldlIHdpbGwgZXhwbG9yZSBUTUIgcGVyIGNhbmNlciBncm91cCBvdmVyIHRpbWUgYnkgY3JlYXRpbmcgZHVtYmJlbGwgcGxvdHMuIFdlIGNsYXNzaWZpZWQgYnkgdXNpbmcgY2FuY2VyIHR5cGVzIHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHNhbXBsZXMgKEhpZ2gtIGFuZCBMb3ctZ3JhZGUgZ2xpb21hcykgdmVyc3VzIGFueSBvdGhlciBjYW5jZXIgZ3JvdXBzLgoKYGBge3IgY3JlYXRlLWR1bWJiZWxsLWN0LCBmaWcud2lkdGggPSAxOCwgZmlnLmhlaWdodCA9IDEwLCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KY2FuY2VyX2dyb3VwcyA8LSB1bmlxdWUoYXMuY2hhcmFjdGVyKGRmX3Bsb3RfZmlsdGVyJGNhbmNlcl9ncm91cF9zdW0pKQpjYW5jZXJfZ3JvdXBzIDwtIHNvcnQoY2FuY2VyX2dyb3VwcywgZGVjcmVhc2luZyA9IEZBTFNFKQpwcmludChjYW5jZXJfZ3JvdXBzKQoKZm9yIChpIGluIHNlcV9hbG9uZyhjYW5jZXJfZ3JvdXBzKSkgewogIHByaW50KGkpCiAgZGZfY3Rfc3ViIDwtIGRmX3Bsb3RfZmlsdGVyICU+JSAKICAgIGZpbHRlcihjYW5jZXJfZ3JvdXBfc3VtID09IGNhbmNlcl9ncm91cHMgW2ldKQogIAogIGlmIChpID09IDEpIHsKICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgIHlsaW0gPC0gOAogICAgfSBlbHNlIGlmIChpID09IDIpIHsKICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgIHlsaW0gPC0gNAogICAgICB9IGVsc2UgewogICAgICAgIHByaW50KGNhbmNlcl9ncm91cHMgW2ldKQogICAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgICAgeWxpbSA8LSA0CiAgICAgIH0KICAgIAogICAgIyBOYW1lIHBsb3RzCiAgICBmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJUTUItZ2Vub21pYy1kdW1iYmVsbCIsICItIiwgY2FuY2VyX2dyb3Vwc1tpXSwgIi5wZGYiKQogICAgcHJpbnQoZm5hbWUpCiAgICAKICAgICMgUnVuIGZ1bmN0aW9uCiAgICBwIDwtIGNyZWF0ZV9kdW1iYmVsbF9jdCh0bWJfZGYgPSBkZl9jdF9zdWIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGltID0geWxpbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2lkID0gY2FuY2VyX2dyb3Vwc1tpXSkKICAgIHBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTgsIGhlaWdodCA9IDEwKQogICAgcHJpbnQocCkKICAgIGRldi5vZmYoKQp9CmBgYAoKIyBUb3RhbCBudW1iZXIgb2YgbXV0YXRpb25zIGFjcm9zcyB0aW1lcG9pbnRzIGFuZCBjYW5jZXIgdHlwZXMgcGVyIFBhdGllbnQgY2FzZQoKYGBge3IgY3JlYXRlLWR1bWJiZWxsLWN0LW11dCwgZmlnLndpZHRoID0gMTgsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CmZvciAoaSBpbiBzZXFfYWxvbmcoY2FuY2VyX2dyb3VwcykpIHsKICBwcmludChpKQogIGRmX2N0X3N1YiA8LSBkZl9wbG90X2ZpbHRlciAlPiUgCiAgICBmaWx0ZXIoY2FuY2VyX2dyb3VwX3N1bSA9PSBjYW5jZXJfZ3JvdXBzIFtpXSkKICAKICBpZiAoaSA9PSAxKSB7CiAgICBwcmludChjYW5jZXJfZ3JvdXBzIFtpXSkKICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICB5bGltIDwtIDI2MAogICAgfSBlbHNlIGlmIChpID09IDIpIHsKICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgICAgIHlsaW0gPC0gMTUwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQoY2FuY2VyX2dyb3VwcyBbaV0pCiAgICAgICAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICAgICAgICB5bGltIDwtIDE1MAogICAgICB9CiAgICAKICAgICMgTmFtZSBwbG90cwogICAgZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCAiTXV0YXRpb25zLWdlbm9taWMtZHVtYmJlbGwiLCAiLSIsIGNhbmNlcl9ncm91cHNbaV0sICIucGRmIikKICAgIHByaW50KGZuYW1lKQogICAgCiAgICAjIFJ1biBmdW5jdGlvbgogICAgcCA8LSBjcmVhdGVfZHVtYmJlbGxfY3RfbXV0KHRtYl9kZiA9IGRmX2N0X3N1YiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSB5bGltLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RfaWQgPSBjYW5jZXJfZ3JvdXBzW2ldKQogICAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxOCwgaGVpZ2h0ID0gMTApCiAgICBwcmludChwKQogICAgZGV2Lm9mZigpCn0KYGBgCgojIFRvdGFsIG51bWJlciBvZiBtdXRhdGlvbnMgYWNyb3NzIHRpbWVwb2ludHMgYW5kIGJpb3NwZWNpbWVuIHNhbXBsZSBwZXIgUGF0aWVudCBjYXNlCkhlcmUsIHdlIHdhbnQgdG8gZXhwbG9yZSB0aGUgbnVtYmVyIG9mIG11dGF0aW9ucyBwZXIgdGltZXBvaW50IGFuZCBiaW9zcGVjaW1lbiBzYW1wbGUgcGVyIHBhdGllbnQgY2FzZS4KCmBgYHtyIGNyZWF0ZS1iYXJwbG90LXNhbXBsZSwgZmlnLndpZHRoID0gNSwgZmlnLmhlaWdodCA9IDQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQpzYW1wbGVzIDwtIHVuaXF1ZShhcy5jaGFyYWN0ZXIoZGZfcGxvdF9maWx0ZXIkS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkpCnByaW50KHNhbXBsZXMpCgpmb3IgKGkgaW4gc2VxX2Fsb25nKHNhbXBsZXMpKSB7CiAgcHJpbnQoaSkKICB0bWJfc3ViIDwtIGRmX3Bsb3RfZmlsdGVyICU+JQogICAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gc2FtcGxlc1tpXSkKICAKICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogIHlsaW0gPSBtYXgoZGZfcGxvdF9maWx0ZXIkbXV0YXRpb25fY291bnQpCiAKICAjIFJ1biBmdW5jdGlvbgogIGZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgc2FtcGxlc1tpXSwgIi1UTUItYmFycGxvdC5wZGYiKQogIHByaW50KGZuYW1lKQogIHAgPC0gY3JlYXRlX2JhcnBsb3Rfc2FtcGxlKHRtYl9kZiA9IHRtYl9zdWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxpbSA9IHlsaW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkID0gc2FtcGxlc1tpXSkKICBwZGYoZmlsZSA9IGZuYW1lLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCiAgcHJpbnQocCkKICBkZXYub2ZmKCkKfQpgYGAKCkxldCdzIHRyeSB0byBkbyB0aGUgc2FtZSBieSB1c2luZyBgZmFjZXRfd3JhcGAgZnVuY3Rpb24uIEFnYWluLCB3ZSBhcmUgbWlzc2luZyB2YWx1ZXMgaW4gdGltZXBvaW50cy4KTWF5YmUgd2UgY2FuIGRpdmlkZSBteSBuYW1lcyhzYW1wbGVzKSwgYWRqdXN0IHlsaW0gcGVyIGVhY2ggYW5kIGNyZWF0ZSAzLTQgcGFuZWxzIGZvciBlYWNoIHlsaW0uCgpgYGB7ciBjcmVhdGUtYmFycGxvdC1zYW1wbGUtcGFuZWwsIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSA0LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KeWxpbSA9IG1heChkZl9wbG90X2ZpbHRlciRtdXRhdGlvbl9jb3VudCkKIAojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsICJUTUItYmFycGxvdC5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfYmFycGxvdF9zYW1wbGVfcGFuZWwodG1iX2RmID0gZGZfcGxvdF9maWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxpbSA9IHlsaW0pCnBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMjUsIGhlaWdodCA9IDIwKQpwcmludChwKQpkZXYub2ZmKCkKYGBgIAoKIyBEUkFGVCBBREpVU1RJTkcgeWxpbQpgYGB7ciBjcmVhdGUtYmFycGxvdC1zYW1wbGUtcGFuZWwtZHJhZnQsIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSA0LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0Kc2FtcGxlcyA8LSB1bmlxdWUoYXMuY2hhcmFjdGVyKGRmX3Bsb3RfZmlsdGVyJEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKQpwcmludChzYW1wbGVzKQoKZm9yIChlYWNoIGluIG5hbWVzKHNhbXBsZXMpKXsKICAKICAjIGFkZCB0aXRsZXMgdG8gcHJpbnQKICBpZiAoZWFjaCA9PSAiUFRfSk5FVjU3VksiKXsKICAgIHlsaW0gPC0gMjYwICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgfQogIGlmIChlYWNoICVpbiUgYygiUFRfMllUMzdHOFAiLCAiUFRfOVM2V01ROTIiLCAiUFRfRVNIQUNXRjYiLCAiUFRfTjhXMjZIMTkiKSl7CiAgICB5bGltIDwtIDE1MCAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogIH0gIAogIGlmIChlYWNoICVpbiUgYygiUFRfMUgyUkVIVDIiLCAiUFRfMzdCNUpSUDEiLCAiUFRfODlYUlpCU0ciLCAiUFRfOEdOM1RRUk0iLCAiUFRfOTlTNUJQRTMiLCAiUFRfOVBKUjBaSzciLCAiUFRfOVM2V01ROTIiLCAiUFRfQ1hUODFHUk0iLCAiUFRfSEZRTktQNVgiLCAiUFRfSlNGQk1LNVYiLCAiUFRfTURXUFJEQlQiLCAiUFRfVEtXVFRSUTciLCAiUFRfWEE5OEhHMUMiKSl7CiAgICB5bGltIDwtIDEwMCAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogIH0KICAgaWYgKGVhY2ggJWluJSBjKCJQVF8wMEcwMDdETSIsICJQVF8wMko1Q1dONSIsICJQVF8xSDJSRUhUMiIsICJQVF8xWkFXTkdXVCIsICJQVF8yNVoyTlgyNyIsICJQVF8yRUNWS1RUUSIsICJQVF8yRlZURDBXUiIsICJQVF8yWVQzN0c4UCIsICJQVF8zN0I1SlJQMSIsICJQVF8zUjBQOTk1QiIsICJQVF8zVDNWR1dDNiIsICJQVF8zVkNTMVBQRiIsICJQVF83TTJQR0NCViIsICJQVF84Mk1YNko3NyIsICJQVF84OVhSWkJTRyIsICJQVF84R04zVFFSTSIsICJQVF85NjJUQ0JWUiIsICJQVF85OFFNUVpZNyIsICJQVF85OVM1QlBFMyIsICJQVF85UEpSMFpLNyIsICJQVF9BUVdEUVcyNyIsICJQVF9DWFQ4MUdSTSIsICJQVF9ERlFBSDdSUyIsICJQVF9FU0hBQ1dGNiIsICJQVF9GTjRHRUVGUiIsICJQVF9IRlFOS1A1WCIsICJQVF9ISk1QNlBIMiIsICJQVF9KUDFGREtOOSIsICJQVF9KU0ZCTUs1ViIsICJQVF9LOFpWN0FQVCIsICJQVF9LTUhHTkNOUiIsICJQVF9NRFdQUkRCVCIsICJQVF9NTlNFSkNETSIsICJQVF9OOFcyNkgxOSIsICJQVF9OUEVUUjhSWSIsICJQVF9QRkE3NjJUSyIsICJQVF9QUjRZQkJIMyIsICJQVF9RSDlINDkxRyIsICJQVF9SSjFUSjJLSCIsICJQVF9TMlNRSlZHSyIsICJQVF9TNFlORTE3WCIsICJQVF9UMk0xMzM4SiIsICJQVF9US1dUVFJRNyIsICJQVF9XNkFXSkpLNyIsICJQVF9XUDg3MUY1UyIsICJQVF9YQTk4SEcxQyIsICJQVF9YSFlCWktDWCIsICJQVF9YVFZRQjlTNCIsICJQVF9ZR04wNlJQWiIsICJQVF9aNEdTM1pRUSIsICJQVF9aTUtNS0NGUSIsICJQVF9aWlJCWDVKVCIpKXsKICAgIHlsaW0gPC0gNTAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICB9Cn0KICAKIAojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsIHNhbXBsZXNbaV0sICJUTUItYmFycGxvdC5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfYmFycGxvdF9zYW1wbGVfcGFuZWwodG1iX2RmID0gZGZfcGxvdF9maWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxpbSA9IHlsaW0pCnBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMjUsIGhlaWdodCA9IDIwKQpwcmludChwKQpkZXYub2ZmKCkKYGBgIAoKCmBgYHtyIGVjaG89VFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAK